#include <iostream>
#include <stdio.h>
#include <typeinfo> // 添加头文件以使用 std::bad_cast

class Base
{
public:
	virtual ~Base() = default; // 基类必须具有虚函数
};

class Derived : public Base
{
public:
	void show()
	{
		std::cout << "Derived class method" << std::endl;
	}
};

/*
	静态转换是将一种数据类型的值强制转换为另一种数据类型的值。
	静态转换通常用于比较类型相似的对象之间的转换，
	例如将 int 类型转换为 float 类型。
	静态转换不进行任何运行时类型检查，因此可能会导致运行时错误。
*/
void static_cast_test()
{
	printf("static_cast test\n");
	int i = 10;
	float f = static_cast<float>(i);
	printf("f = %f\n", f);
}

/*
动态转换（dynamic_cast）是 C++ 中用于在继承层次结构中进行向下转换（downcasting）的一种机制。
动态转换通常用于将一个基类指针或引用转换为派生类指针或引用。动态转换在运行时进行类型检查。
如果转换失败，对于指针类型会返回 nullptr，对于引用类型则会抛出 std::bad_cast 异常。
*/
void dynamic_cast_test()
{
	// 指针类型的动态转换

	Base *ptr_base = new Derived; // 基类指针指向派生类对象
	// 将基类指针转换为派生类指针
	Derived *ptr_derived = dynamic_cast<Derived *>(ptr_base);

	if (ptr_derived)
	{
		ptr_derived->show(); // 成功转换，调用派生类方法
	}
	else
	{
		std::cout << "Dynamic cast failed!" << std::endl;
	}
	delete ptr_base;
}

void dynamic_cast_test2()
{
	// 引用类型的动态转换

	Derived derived_obj;
	Base &ref_base = derived_obj; // 基类引用绑定到派生类对象

	try
	{
		// 将基类引用转换为派生类引用
		Derived &ref_derived = dynamic_cast<Derived &>(ref_base);
		ref_derived.show(); // 成功转换，调用派生类方法
	}
	catch (const std::bad_cast &e)
	{
		std::cout << "Dynamic cast failed: " << e.what() << std::endl;
	}
}

void const_cast_test()
{
	const int i = 10;
	int &r = const_cast<int &>(i); // 常量转换，将const int转换为int
}

int main()
{
	static_cast_test();

	dynamic_cast_test();

	dynamic_cast_test2();

	const_cast_test();

	return 0;
}